package Control;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Date;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import Bean.BeanFilme;
import Bean.BeanFilmeConsulta;
import Bean.BeanUsuario;
import Bean.BeanUsuarioConsulta;
import DAO.DAOExceptionMelhorCinema;
import DAO.DAOFilme;
import DAO.DAOUsuario;
import Model.Filme;
import Model.Usuario;

public class ControladorUsuario extends HttpServlet {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	protected void processRequest(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, Exception {

		response.setContentType("text/html;charset=ISO-8859-1");
		PrintWriter out = response.getWriter();

		try {
			String opcao = request.getParameter("opcao");
			HttpSession session = request.getSession();
			if (session == null) {
				response.sendRedirect("../AcessoAoSistema/login.jsp");
			} else {
				if (opcao != null) {
					if (opcao.equals("logar")) {
						BeanUsuario bean = (BeanUsuario) session
								.getAttribute("beanUsuario");
						this.controleValidarUsuario(bean.getLogin(), bean
								.getSenha(), response, session);
					} else {
						if (opcao.equals("novo")) {
							cadastrarUsuario(request, response);
						} else {
							if (opcao.equals("salvar")) {
								salvarUsuario(request, response);
								//pesquisarUsuario(request, response);

							} else {
								if (opcao.equals("pesquisar")) {
									pesquisarUsuario(request, response);
								} else {
									if (opcao.equals("editar")) {
										editarUsuario(request, response);
										
									}else{
										if (opcao.equals("atualizar")) {
											atualizarUsuario(request, response);
											
										}else{
											if (opcao.equals("excluir")) {
												excluirUsuario(request, response);
											}
										}
									}
								}
							}

						}
					}
				}
			}
		} catch (Exception e) {
			System.out.println(e.getLocalizedMessage());
		} finally {
			out.close();
		}
	}

	private ArrayList<Integer> atualizaPaginacao(HttpServletRequest request,
			HttpServletResponse response, boolean filtro) throws Exception {

		DAOUsuario daoPaginanacao = new DAOUsuario();
		ArrayList<Integer> paginacao = new ArrayList<Integer>();
		if (filtro) {

			int idadeMinima = 0;
			String filtroNome = "";
			if (request.getParameter("filtroNome") != null)
				filtroNome = request.getParameter("filtroNome");
			Integer numero = daoPaginanacao.buscaNumeroPaginasFiltro(
					filtroNome);
			for (int i = 1; i <= numero; i++) {
				paginacao.add(i);
			}

		} else {
			Integer numero = daoPaginanacao.buscaNumeroPaginasFiltro("");
			for (int i = 1; i <= numero; i++) {
				paginacao.add(i);
			}

		}

		return paginacao;

	}

	private int verificaPaginacao(HttpServletRequest request,
			HttpServletResponse response) {
		String numPag = request.getParameter("numPag");
		// BeanFilmeConsulta bean = (BeanFilmeConsulta)
		// request.getAttribute("beanFilmeConsulta");
		String paginaAtual = request.getParameter("paginaAtual");

		int iPaginaAtual; // = bean.getNumeroPaginas().size();
		if (paginaAtual != null)
			iPaginaAtual = Integer.parseInt(paginaAtual);
		else
			iPaginaAtual = 1;

		if (numPag != null) {
			if (numPag.equals("Primeira")) {
				numPag = "1";
			} else {
				if (numPag.equals("Ultima")) {
					numPag = "999";
				} else {
					if (numPag.equals("Anterior")) {
						if (iPaginaAtual > 1) {
							Integer temp = iPaginaAtual - 1;
							numPag = temp.toString();
						} else {
							numPag = "1";
						}
					} else {
						if (numPag.equals("Proxima")) {

							Integer temp = iPaginaAtual + 1;
							numPag = temp.toString();

						}
					}

				}
			}
			return Integer.parseInt(numPag);
		} else
			return 1;

	}

	private void novoUsuario(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		BeanUsuario bUsuario = new BeanUsuario();
		request.setAttribute("beanUsuarioCadastro", bUsuario);
		// atualizar lista de pesquias
		DAOUsuario dao2 = new DAOUsuario();
		BeanUsuarioConsulta beanConsulta = new BeanUsuarioConsulta();
		beanConsulta.setNumeroPaginas(atualizaPaginacao(request, response,
				false));
		int pagina = verificaPaginacao(request, response);
		if (pagina > beanConsulta.getNumeroPaginas().size())
			pagina = beanConsulta.getNumeroPaginas().size();
		beanConsulta.setPaginaAtual(pagina);
		beanConsulta.setUsuarios(dao2.listarFiltroUsuario("", pagina));

		request.setAttribute("beanFilmeConsulta", beanConsulta);

		RequestDispatcher dispatcher = request
				.getRequestDispatcher("Filmes/gerenciarUsuarios.jsp");
		dispatcher.forward(request, response);

	}
	
	private void atualizarUsuario(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		DAOUsuario dao = new DAOUsuario();
		String on = request.getParameter("is_Admin");
		boolean isAdmin = false;
		if (on.equals("on")){
			isAdmin = true;
			
		}
		Usuario user = new Usuario(request.getParameter("login"), request
				.getParameter("senha"), isAdmin, request
				.getParameter("nomeUsuario"),0);
		if (!dao.atualizarUsuario(user)) {
			response.sendRedirect("AcessoAoSistema/login.jsp");
		} else
			response.sendRedirect("ControladorUsuario?opcao=pesquisar");
	}
	
	private void editarUsuario(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		DAOUsuario dao = new DAOUsuario();
		String login = request.getParameter("login");
		Usuario user = dao.buscaUsuario(login);
		BeanUsuario bean = new BeanUsuario(user.getLogin(), user.getSenha(),user.isIs_Admin(),user.getNomeUsuario(),"", user.getCodigo());
		request.setAttribute("beanUsuarioCadastro", bean);
		// atualizar lista de pesquias
		DAOUsuario dao2 = new DAOUsuario();
		BeanUsuarioConsulta beanConsulta = new BeanUsuarioConsulta();
		beanConsulta.setNumeroPaginas(atualizaPaginacao(request, response,
				false));
		int pagina = verificaPaginacao(request, response);
		if (pagina > beanConsulta.getNumeroPaginas().size())
			pagina = beanConsulta.getNumeroPaginas().size();
		beanConsulta.setPaginaAtual(pagina);
		beanConsulta.setUsuarios(dao2.listarFiltroUsuario("", pagina));

		request.setAttribute("beanUsuarioConsulta", beanConsulta);
		RequestDispatcher dispatcher = request
				.getRequestDispatcher("usuarios/gerenciarUsuarios.jsp");
		dispatcher.forward(request, response);
	}

	private void excluirUsuario(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		DAOUsuario dao = new DAOUsuario();
		String login = request.getParameter("login");
		try{
			dao.excluirUsuario(login);
			response.sendRedirect("ControladorUsuario?opcao=pesquisar");
		} catch(Exception e){
			response.sendRedirect("ControladorUsuario?opcao=pesquisar&result=dependencia");
		}
	}

	
	private void pesquisarUsuario(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		DAOUsuario dao = new DAOUsuario();
		BeanUsuarioConsulta beanConsulta = new BeanUsuarioConsulta();
		beanConsulta
				.setNumeroPaginas(atualizaPaginacao(request, response, true));
		int pagina = verificaPaginacao(request, response);
		if (pagina > beanConsulta.getNumeroPaginas().size())
			pagina = beanConsulta.getNumeroPaginas().size();
		beanConsulta.setPaginaAtual(pagina);

		String filtroNome = "";
		if (request.getParameter("filtroNome") != null)
			filtroNome = request.getParameter("filtroNome");
		
		ArrayList<Usuario> listarFiltro = dao.listarFiltroUsuario(filtroNome, pagina);
		beanConsulta.setUsuarios(listarFiltro);
		request.setAttribute("beanUsuarioConsulta", beanConsulta);
		RequestDispatcher dispatcher = request
				.getRequestDispatcher("usuarios/gerenciarUsuarios.jsp");
		dispatcher.forward(request, response);

	}

	private void salvarUsuario(HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		BeanUsuario bean = (BeanUsuario) request
				.getAttribute("beanUsuarioCadastro");
		
		String on = request.getParameter("is_Admin");
		boolean isAdmin = false;
		if (on.equals("on")){
			isAdmin = true;
			
		}
		
		Usuario user = new Usuario(request.getParameter("login"), request
				.getParameter("senha"), isAdmin, request
				.getParameter("nomeUsuario"), 0);
		DAOUsuario dao = new DAOUsuario();
		Usuario user2 = dao.buscaUsuario(request.getParameter("login"));
		if (user2 == null) {
			dao = new DAOUsuario();
			dao.salvarUsuario(user);
			response.sendRedirect("ControladorUsuario?opcao=pesquisar");
		} else {
			response.sendRedirect("ControladorUsuario?opcao=pesquisar&usuario=true");
		}
		
	}

	private void cadastrarUsuario(HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		BeanUsuario bUsuario = new BeanUsuario();
		request.setAttribute("beanUsuarioCadastro", bUsuario);
		// atualizar lista de pesquias
		DAOUsuario dao = new DAOUsuario();
		BeanUsuarioConsulta beanConsulta = new BeanUsuarioConsulta();
		beanConsulta
				.setNumeroPaginas(atualizaPaginacao(request, response, true));
		int pagina = verificaPaginacao(request, response);
		if (pagina > beanConsulta.getNumeroPaginas().size())
			pagina = beanConsulta.getNumeroPaginas().size();
		beanConsulta.setPaginaAtual(pagina);

		String filtroNome = "";
		if (request.getParameter("filtroNome") != null)
			filtroNome = request.getParameter("filtroNome");
		
		ArrayList<Usuario> listarFiltro = dao.listarFiltroUsuario(filtroNome, pagina);
		beanConsulta.setUsuarios(listarFiltro);
		request.setAttribute("beanUsuarioConsulta", beanConsulta);
		RequestDispatcher dispatcher = request
				.getRequestDispatcher("usuarios/gerenciarUsuarios.jsp");
		dispatcher.forward(request, response);
	}

	private void controleValidarUsuario(String login, String senha,
			HttpServletResponse response, HttpSession session) throws Exception {
		DAOUsuario dao = new DAOUsuario();
		Usuario usuario = null;
		usuario = dao.validarUsuario(login, senha);
		if (usuario != null) {
			BeanUsuario beanUsuario = new BeanUsuario(usuario.getLogin(),
					usuario.getSenha(), usuario.isIs_Admin(), usuario
							.getNomeUsuario(), "logar", usuario.getCodigo());
			session.setAttribute("beanUsuario", beanUsuario);
			response.sendRedirect("../paginaPrincipal.jsp");
		} else
			response.sendRedirect("../AcessoAoSistema/login.jsp?acesso=negado");
	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		try {
			processRequest(request, response);
		} catch (Exception e) {
			Logger.getLogger(ControladorUsuario.class.getName()).log(
					Level.SEVERE, null, e);
		}
	}

	/**
	 * response.sendRedirect("jsp/livros/cadastroLivro.jsp"); Handles the HTTP
	 * <code>POST</code> method.
	 * 
	 * @param request
	 *            servlet request
	 * @param response
	 *            servlet response
	 * @throws ServletException
	 *             if a servlet-specific error occurs
	 * @throws IOException
	 *             if an I/O error occurs
	 */
	@Override
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		try {
			processRequest(request, response);
		} catch (Exception e) {
			Logger.getLogger(ControladorUsuario.class.getName()).log(
					Level.SEVERE, null, e);
		}
	}

	/**
	 * Returns a short description of the servlet.
	 * 
	 * @return a String containing servlet description
	 */
	@Override
	public String getServletInfo() {
		return "Short description";
	}// </editor-fold>

}
